package com.alks.common.service;

import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.HashOperations;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @author:xxxxx
 * @create: 2023-06-16 09:24
 * @Description: redis operate
 */
public interface RedisService {


    //TODO redis设置参数
     void set(String key, String value);

    /**
     * 设置值和过期时间
     * @param key
     * @param value
     * @param expireTime
     */
     void set(String key, String value, long expireTime);

     String get(String key);

     boolean delete(String key);

     Long getExpireTime(String key);

     Set scan(String key);

    RedisConnectionFactory getConnectionFactory();

    /*设置新的BitMap*/
    void setBit(String key, long offset, boolean value);

    /*输出BitMap值*/
    boolean getBit(String key, long offset);

    /*找出第一个0*/
    long findZero(String key);

    /**
     * 设置过期时间（自定义）
     * @param key 键
     * @param timeOut 过期时间
     * @param timeUnit 过期时间的单位
     */
    void setOutTime(String key, long timeOut, TimeUnit timeUnit);

    /**
     * 设置过期时间（单位：秒）
     */
    void setOutTime(String key, long timeOut);

    /**
     * 重设过期时间（30天）
     */
    public void setOutTime(String key);

    /**
     * 生成订购单号【companyId+key+yymm+length+序号】
     * @param key 内键
     * @return 创建好的订单号
     */
    String slipNoCreat(String key);

    String updateOrderNumber(String orderKey, String currentOrderNumber, int length);

    /**
     * 生成单号 (公司+key+时间戳+流水号3位)
     * @param key 内键 【companyId+key+yyyyMMddHHmmss+序号】
     * @return 创建好的订单号
     */
    String slipNoCreatByTime(String key);

    /**
     * 生成订单号 自定义长度
     * @param k 内键
     * @param length 长度
     * @return 订单号
     */
    String slipNoCreat(String k,int length);

    String barcodeCreat(String k, int length);

    String barcodeCreatTwo(String k, int length);

    String barcodeCreatAdd(String k, int length);

    /**
     * 生成订单号 自定义长度 自定义companyId
     * @param companyId 公司ID
     * @param k 内键
     * @param length 长度
     * @return 订单号
     */
    String slipNoCreat(String companyId,String k, int length);


    /**
     * 生成单号
     * @param k 前缀  列如 BF
     * @param type 时间格式 列如 1 yyyyMM
     * @param length
     * @return
     */
    String slipNoGenerate(String k,int length,int type);

    /**
     * 获得时间戳+自增数据
     * @param key      根据key键，获得自增数据
     * @param length   自增长度,如：填7，就是7位数字自增
     * @param timezone 想要获得的时间戳保留字段 : yyyyMMddHHmmss (yyyy-MM-dd HH:mm:ss)
     */
    String numberGenerate(String key,String length,String timezone);

    /**
     * 移除过期时间
     * @param key 键
     */
    void rmOutTime(String key);

    /**
     * 写入hash类型数据
     * 未设置过期时间
     * @param key 主键
     * @param hashKey hash键
     * @param value hash值
     */
    void setHash(String key,String hashKey,String value);

    /**
     * 写入hash类型数据(值为list类型) 如果存在则覆盖
     * 未设置过期时间
     * @param key 主键
     * @param hashKey hash键
     * @param value hash值
     */
    void setHash(String key, String hashKey, List<String> value);

    /**
     * 补充Hash的值 如果不存在则新增
     * 未设置过期时间
     * @param key 主键
     * @param hashKey hash键
     * @param value hash值
     */
    void addHashAsSet(String key, String hashKey, String value);

    /**
     * 输出hash数据
     * @param key 主键
     * @param hashKey hash键
     * @return hash值
     */
    String getHash(String key,String hashKey);

    /**
     * 删除hash数据
     *
     * @param key     主键
     * @param hashKey hash键
     */
    void deleteHash(String key, String hashKey);

    /**
     * 输出Set类型数据
     * @param key 主键
     * @param hashKey hash键
     * @return hash值
     */
    Set<String> getHashAsSet(String key,String hashKey);

    /**
     * 不存在就写入
     * @param key
     * @param value
     * @param expireTime
     * @param timeUnit
     * @return
     */
    Boolean setIfAbsent(String key, String value, long expireTime, TimeUnit timeUnit);

    /**
     * 设置过期时间
     * @param key
     * @param expireTime
     * @param timeUnit
     * @return
     */
    boolean setExpireTime(String key, long expireTime, TimeUnit timeUnit);


    /**
     * 缓存Map
     *
     * @param key
     * @param dataMap
     */
    <T> void setCacheMap(final String key, final Map<String, T> dataMap);

    /**
     * 获得缓存的Map
     *
     * @param key
     * @return
     */
    <T> Map<String, T> getCacheMap(final String key);

    /**
     * 往Hash中存入数据
     *
     * @param key   Redis键
     * @param hKey  Hash键
     * @param value 值
     */
    <T> void setCacheMapValue(final String key, final String hKey, final T value);

    /**
     * 获取Hash中的数据
     *
     * @param key  Redis键
     * @param hKey Hash键
     * @return Hash中的对象
     */
    <T> T getCacheMapValue(final String key, final String hKey);

    /**
     * 获取多个Hash中的数据
     *
     * @param key   Redis键
     * @param hKeys Hash键集合
     * @return Hash对象集合
     */
    <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys);

    /**
     * 删除Hash中的某条数据
     *
     * @param key  Redis键
     * @param hKey Hash键
     * @return 是否成功
     */
    boolean deleteCacheMapValue(final String key, final String hKey);

    /**
     * 是否存在
     * @param key
     * @return
     */
    boolean hasKey(final String key);

    /**
     * 获取哈希表大小，如果为空返回0
     * @param key
     * @return
     */
    long hashSize(String key);

    /**
     * 如果哈希表为空，则删除该键
     * @param key 哈希表的键
     */
    void deleteIfHashEmpty(String key);

    HashOperations<String, String, String> opsForHash();

    /**
     * 计数
     * @param redisKey
     * @param i
     * @return
     */
    long incr(String redisKey, int i);
}

